/*
 * @Author: GL
 * @Date: 2022-09-17 18:26:09
 * @LastEditors: GL
 * @LastEditTime: 2023-04-19 15:09:35
 * @Description: 服务端启动文件
 */
const express  = require('express')
// 创建服务器实例
const app = express()
// 导入token解析和密钥
const {expressjwt} = require('express-jwt')
const config = require('./router_handler/config')
const joi = require('joi')
// 解决跨域问题
const cors = require('cors')
// api集合
const useRouter = require('./router/user')
const userInfoRouter = require('./router/userInfo')
const articleRouter = require('./router/article')
const collectRouter = require('./router/collect')
const orderRouter = require('./router/order')
const goodsRouter = require('./router/product')
const payRouter = require('./router/pay')
const userReleaseRouter = require('./router/userRelease')
// 图片上传
const uploadImageRouter = require('./router/upload')
// 视频上传
const uploadVideoRouter = require('./router/video')
// 轮播图上传
const uploadSwipperS = require('./router/swipper')

// 解析表单数据
app.use(express.urlencoded({extended:false}))
app.use(express.json())
// 解决跨域问题
app.use(cors())
// 静态资源托管
app.use(express.static('file'))

app.use((req,res,next) => {
  res.cc = function (err,status = 1) {
    res.send({
      status,
      message:err instanceof Error ? err.message : err  //对err性质进行判断
    })
  }
  next()
})


// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
app.use(expressjwt({secret:config.jwtSecretKey,algorithms: ["HS256"]}).unless({path:[/^\/api\/|\/goods\/api\/|\/video\/api/]}))    //unless对不需要权限的接口放行
// 在路由之前分装数据响应中间件

app.use('/api',useRouter)       //注册路由模块，添加路劲前缀,放在解析数据中间件之后
app.use('/user',userInfoRouter) //用户详细信息
app.use('/work',articleRouter)  //文章管理
app.use('/col',collectRouter)   //收藏管理
app.use('/con',orderRouter)   //待联系
app.use('/goods',goodsRouter)   //商品管理
app.use(payRouter)              //支付管理
app.use(userReleaseRouter)      //用户发布信息
app.use('/api',uploadImageRouter) //图片上传
app.use('/video',uploadVideoRouter) //照片上传
app.use('/api',uploadSwipperS) //轮播图管理

// 错误中间件
app.use(function (err, req, res, next) {
  // 数据验证失败
  if (err instanceof joi.ValidationError) return res.cc(err)
  if (err.name === 'UnauthorizedError') return res.cc('身份认证失败！')
  // 未知错误
  res.send(err)
})

// 启动服务器
app.listen(88, function(err){
  if (err) console.log(err);
  console.log(`
  ╭╩══╮╔══════╗╔══════╗╔═══════╗ 
╭╯嘟嘟嘟╠╣发车了╠╣快上车╠╣╣！！！
╰⊙══⊙╯╚◎════◎╝╚◎════◎╝╚◎═════◎╝
  `);
});
 